package admin

import (
	"github.com/gin-gonic/gin"
	"github.com/shopspring/decimal"
	"mojieshi/define"
	"mojieshi/models"
	"mojieshi/service"
	"net/http"
	"strconv"
	"time"
)

// 获取服务订单列表
type JsonExportShop struct {
	Ordernum    string `json:"ordernum"` //订单号
	Bid         int    `json:"bid"`
	Mid         int    `json:"mid"`          //会员ID
	ExpressNo   string `json:"express_no"`   //快递单号
	CreatetimeS string `json:"createtime_s"` //开始下单时间
	CreatetimeE string `json:"createtime_e"` //结束下单时间
	Status      int    `json:"status"`       //0未支付;1已支付;2已发货,3已收货,4关闭 5退款
	Paytypeid   int    `json:"paytypeid"`    //支付方式 1余额支付 2微信支付 3支付宝支付 4货到付款 5转账汇款 11百度小程序 12头条小程序 101连连
	PaytimeS    string `json:"paytime_s"`    //支付时间
	PaytimeE    string `json:"paytime_e"`    //支付时间
	Aid         int    `json:"aid"`
	Page        int    `json:"page"`
	Limit       int    `json:"limit"`
}
type ReturnShopOrder struct {
	ID           int                      `gorm:"type:int(11); primaryKey" json:"id"`
	Aid          int                      `gorm:"type:int(11);" json:"aid"`             //账户ID
	Mid          int                      `gorm:"type:int(11);" json:"mid"`             //会员ID
	Ordernum     string                   `gorm:"type:varchar(255);" json:"ordernum"`   //订单号
	Proid        int                      `gorm:"type:int(11);" json:"proid"`           //商品ID
	Title        string                   `gorm:"type:varchar(255);" json:"title"`      //订单名称
	Totalprice   decimal.Decimal          `json:"totalprice"`                           //支付总金额
	ProductPrice decimal.Decimal          `json:"product_price"`                        //商品金额
	ScoredkMoney decimal.Decimal          `json:"scoredk_money"`                        //积分抵扣金额
	LeveldkMoney decimal.Decimal          `json:"leveldk_money"`                        //会员等级优惠金额
	CouponMoney  decimal.Decimal          `json:"coupon_money"`                         //优惠券金额
	CouponRid    string                   `gorm:"type:varchar(255);" json:"coupon_rid"` //优惠券coupon_record的id
	Scoredkscore int                      `gorm:"type:int(11);" json:"scoredkscore"`    //积分抵扣用掉的积分
	Givescore    int                      `gorm:"type:int(11);" json:"givescore"`       //赠送积分
	Barcode      string                   `gorm:"type:varchar(255);" json:"barcode"`    //sku
	Ggid         int                      `gorm:"type:int(11);"json:"ggid"`             //规格ID
	Ggname       string                   `gorm:"type:varchar(255);" json:"ggname"`     //规格名称
	Createtime   int                      `gorm:"type:int(11);" json:"createtime"`      //创建时间
	Num          int                      `gorm:"type:int(11);" json:"num"`             //购买数量
	Status       int                      `gorm:"type:int(11);" json:"status"`          //0未支付;1已支付;2申请退款；3已驳回；4已退款；5关闭 6已激活 7赠送 8已完成
	Message      string                   `gorm:"type:varchar(255);" json:"message"`    //留言
	Remark       string                   `gorm:"type:varchar(255);" json:"remark"`     //后台备注
	Payorderid   int                      `gorm:"type:int(11);" json:"payorderid"`      //订单支付表id
	Paytypeid    int                      `gorm:"type:int(11);" json:"paytypeid"`       //支付方式 2余额支付 1微信支付
	Paytype      string                   `gorm:"type:varchar(255);" json:"paytype"`    //支付方式文本
	Paynum       string                   `gorm:"type:varchar(255);" json:"paynum"`     //支付单号
	Paytime      int                      `gorm:"type:int(11);" json:"paytime"`         //支付时间
	Endtime      int                      `gorm:"type:int(11);" json:"endtime"`         //完成时间
	Platform     string                   `gorm:"type:varchar(255);"json:"platform"`    //来源平台 mp公众号 wx微信小程序
	UserDelete   int                      `gorm:"type:int(11);" json:"user_delete"`     //用户删除 0未删除 1已删除
	JuanPrice    decimal.Decimal          `json:"juan_price"`                           //捐赠金额
	UserName     string                   `json:"user_name"`                            //昵称
	UserPic      string                   `json:"user_pic"`                             //用户头显
	FuTao        []models.MFuwuOrderLog   `json:"fu_tao"`                               //套餐
	FuXiang      []models.MFuwuOrderGoods `json:"fu_xiang"`                             //服务项目
}

func GetFuOrderList(c *gin.Context) {
	var jsonData JsonExportShop
	err := c.ShouldBindJSON(&jsonData)
	if err != nil {
		define.Response.ResultFail(c, 10000, define.JsonData, "")
		return
	}
	var list []models.MFuwuOrder
	var count int64
	if jsonData.Page == 0 {
		jsonData.Page = -1
	}
	if jsonData.Limit == 0 {
		jsonData.Limit = -1
	}
	offsetVal := (jsonData.Page - 1) * jsonData.Limit
	if jsonData.Page == -1 && jsonData.Limit == -1 {
		offsetVal = -1
	}
	tx := models.DB.Model(new(models.MFuwuOrder)).Where("aid=? AND ordernum LIKE ?", jsonData.Aid, "%"+jsonData.Ordernum+"%")
	if jsonData.Mid > 0 {
		tx = tx.Where("mid=?", jsonData.Mid)
	}
	if jsonData.Status >= 0 && jsonData.Status < 80 {
		tx = tx.Where("status=?", jsonData.Status)
	}
	if jsonData.Paytypeid > 0 {
		tx = tx.Where("paytypeid=?", jsonData.Paytypeid)
	}
	if jsonData.CreatetimeS != "" {
		tx = tx.Where("createtime>?", define.TimeUnix(jsonData.CreatetimeS))
	}
	if jsonData.CreatetimeE != "" {
		tx = tx.Where("createtime<?", define.TimeUnix(jsonData.CreatetimeE))
	}
	tx = tx.Count(&count).Limit(jsonData.Limit).Offset(offsetVal).Order("id desc").Find(&list)
	if tx.Error != nil {
		c.JSON(http.StatusOK, gin.H{
			"code": 10001,
			"msg":  tx.Error,
		})
		return
	}
	var returnJson []ReturnShopOrder
	for _, v := range list {
		var userData models.MMember
		err = models.DB.Model(new(models.MMember)).Where("id=?", v.Mid).First(&userData).Error
		if err != nil {
			define.Response.ResultFail(c, 10002, err.Error(), "")
			return
		}
		var mData []models.MFuwuOrderLog
		err = models.DB.Model(new(models.MFuwuOrderLog)).Where("orderid=?", v.ID).Find(&mData).Error
		if err != nil {
			define.Response.ResultFail(c, 10003, err.Error(), "")
			return
		}
		var xData []models.MFuwuOrderGoods
		err = models.DB.Model(new(models.MFuwuOrderGoods)).Where("orderid=?", v.ID).Find(&xData).Error
		if err != nil {
			define.Response.ResultFail(c, 10004, err.Error(), "")
			return
		}
		one := ReturnShopOrder{
			ID:           v.ID,
			Mid:          v.Mid,
			Ordernum:     v.Ordernum,
			Createtime:   v.Createtime,
			Proid:        v.Proid,                 //商品ID
			Title:        v.Title,                 //订单名称
			Barcode:      v.Barcode,               //sku
			Ggid:         v.Ggid,                  //规格ID
			Ggname:       v.Ggname,                //规格名称
			Num:          v.Num,                   //购买数量
			Totalprice:   v.Totalprice.Round(2),   //
			ProductPrice: v.ProductPrice.Round(2), //
			ScoredkMoney: v.ScoredkMoney.Round(2), //
			LeveldkMoney: v.LeveldkMoney.Round(2), //
			CouponMoney:  v.CouponMoney.Round(2),  //优惠券金额
			Scoredkscore: v.Scoredkscore,          //积分抵扣用掉的积分
			Givescore:    v.Givescore,             //赠送积分
			Status:       v.Status,
			Message:      v.Message,
			Remark:       v.Remark,
			Payorderid:   v.Payorderid,
			Paytypeid:    v.Paytypeid,
			Paytype:      v.Paytype,
			Paynum:       v.Paynum,     //支付单号
			Paytime:      v.Paytime,    //支付时间
			Platform:     v.Platform,   //来源平台 mp公众号 wx微信小程序
			UserDelete:   v.UserDelete, //用户删除 0未删除 1已删除
			JuanPrice:    v.JuanPrice,  //捐赠金额
			UserName:     userData.Nickname,
			UserPic:      userData.Headimg,
			FuTao:        mData,
			FuXiang:      xData,
		}
		returnJson = append(returnJson, one)
	}
	c.JSON(http.StatusOK, gin.H{
		"success": true,
		"code":    0,
		"data": map[string]interface{}{
			"list":  returnJson,
			"count": count,
		},
	})
}

// 修改订单备注
func EditFuOrderRemark(c *gin.Context) {
	//获取传值
	var jsonData models.MFuwuOrder
	err := c.ShouldBindJSON(&jsonData)
	if err != nil {
		c.JSON(http.StatusOK, gin.H{
			"code": 10000,
			"msg":  err,
		})
		return
	}
	//修改数据
	err = models.DB.Model(new(models.MFuwuOrder)).Where("id=?", jsonData.ID).Update("remark", jsonData.Remark).Error
	if err != nil {
		c.JSON(http.StatusOK, gin.H{
			"code": 10003,
			"msg":  err.Error(),
		})
		return
	}
	//写入日志
	userId, _ := strconv.Atoi(c.GetHeader("userId")) //将字符串转为int
	userName, bid := models.UserName(userId)
	logData := "管理员：" + userName + "，修改了服务订单:" + strconv.Itoa(jsonData.ID) + "的备注"
	models.LogAdd(3, "修改服务订单", userId, logData, bid, jsonData.Aid)
	c.JSON(http.StatusOK, gin.H{
		"success": true,
		"code":    0,
		"msg":     "成功！",
	})
}

// 获取预约单
type MFuwuYu struct {
	ID               int             `gorm:"type:int(11); primaryKey" json:"id"`
	Aid              int             `gorm:"type:int(11);" json:"aid"`                     //账户ID
	Mid              int             `gorm:"type:int(11);" json:"mid"`                     //会员ID
	Nickname         string          `json:"nickname"`                                     //会员昵称
	Orderid          int             `gorm:"type:int(11);" json:"orderid"`                 //订单ID
	Tid              int             `gorm:"type:int(11);" json:"tid"`                     //服务套餐ID
	Xid              int             `gorm:"type:int(11);" json:"xid"`                     //服务套餐项目ID
	Bid              int             `gorm:"type:int(11);" json:"bid"`                     //服务商ID
	BidName          string          `gorm:"type:varchar(255);" json:"bid_name"`           //服务商名称
	Ordernum         string          `gorm:"type:varchar(255);" json:"ordernum"`           //订单号
	Proid            int             `gorm:"type:int(11);" json:"proid"`                   //商品ID
	Name             string          `gorm:"type:varchar(255);" json:"name"`               //服务名称
	Num              int             `gorm:"type:int(11);" json:"num"`                     //次数
	YNum             int             `gorm:"type:int(11);" json:"y_num"`                   //当前第几次
	CostPrice        decimal.Decimal `json:"cost_price"`                                   //阿姨结算
	SellPrice        decimal.Decimal `json:"sell_price"`                                   //销售价
	Status           int             `gorm:"type:int(11);" json:"status"`                  //0未派单；1待接单;2服务中;3已完成；4取消，5异常
	Createtime       int             `gorm:"type:int(11);" json:"createtime"`              //创建时间
	JieTime          int             `gorm:"type:int(11);" json:"jie_time"`                //接单时间
	Endtime          int             `gorm:"type:int(11);" json:"endtime"`                 //完成时间
	Linkman          string          `gorm:"type:varchar(255);" json:"linkman"`            //姓名
	Tel              string          `gorm:"type:varchar(255);" json:"tel"`                //手机号
	Province         string          `gorm:"type:varchar(255);" json:"province"`           //省/州
	City             string          `gorm:"type:varchar(255);" json:"city"`               //城市
	District         string          `gorm:"type:varchar(255);" json:"district"`           //区/镇
	Area             string          `gorm:"type:varchar(255);" json:"area"`               //街道
	Address          string          `gorm:"type:varchar(255);" json:"address"`            //详情地址
	HouseNumber      string          `gorm:"type:varchar(255);" json:"house_number"`       //门牌号
	YuYueDate        string          `gorm:"type:varchar(255);" json:"yu_yue_date"`        //预约日期
	StartDefaultTime string          `gorm:"type:varchar(255);" json:"start_default_time"` //预约开始时间
	EndDefaultTime   string          `gorm:"type:varchar(255);" json:"end_default_time"`   //预约结束时间
	YyueOrder        string          `gorm:"type:varchar(255);" json:"yyue_order"`         //	预约单号
	Remark           string          `gorm:"type:varchar(255);" json:"remark"`
}

func GetFuYue(c *gin.Context) {
	var jsonData JsonExportShop
	err := c.ShouldBindJSON(&jsonData)
	if err != nil {
		define.Response.ResultFail(c, 10000, define.JsonData, "")
		return
	}
	var list []MFuwuYu
	var count int64
	if jsonData.Page == 0 {
		jsonData.Page = -1
	}
	if jsonData.Limit == 0 {
		jsonData.Limit = -1
	}
	offsetVal := (jsonData.Page - 1) * jsonData.Limit
	if jsonData.Page == -1 && jsonData.Limit == -1 {
		offsetVal = -1
	}
	selectData := "m_fuwu_yu.id,m_fuwu_yu.aid,m_fuwu_yu.mid,m_member.nickname as nickname,m_fuwu_yu.orderid,m_fuwu_yu.tid,m_fuwu_yu.xid,m_fuwu_yu.bid,m_fuwu_yu.bid_name" +
		",m_fuwu_yu.ordernum,m_fuwu_yu.proid,m_fuwu_yu.name,m_fuwu_yu.num,m_fuwu_yu.y_num,m_fuwu_yu.cost_price,m_fuwu_yu.sell_price,m_fuwu_yu.status" +
		",m_fuwu_yu.createtime,m_fuwu_yu.jie_time,m_fuwu_yu.endtime,m_fuwu_yu.linkman,m_fuwu_yu.tel,m_fuwu_yu.province,m_fuwu_yu.city,m_fuwu_yu.district" +
		",m_fuwu_yu.area,m_fuwu_yu.address,m_fuwu_yu.house_number,m_fuwu_yu.yu_yue_date,m_fuwu_yu.start_default_time,m_fuwu_yu.end_default_time" +
		",m_fuwu_yu.remark,m_fuwu_yu.yyue_order"
	tx := models.DB.Table("m_fuwu_yu").Select(selectData).Joins("left join m_member on m_member.id=m_fuwu_yu.mid").Where("m_fuwu_yu.aid=? AND m_fuwu_yu.yyue_order LIKE ?", jsonData.Aid, "%"+jsonData.Ordernum+"%")
	if jsonData.Mid > 0 {
		tx = tx.Where("m_fuwu_yu.mid=?", jsonData.Mid)
	}
	if jsonData.Status >= 0 && jsonData.Status < 80 {
		tx = tx.Where("m_fuwu_yu.status=?", jsonData.Status)
	}
	if jsonData.Bid > 0 {
		tx = tx.Where("m_fuwu_yu.bid=?", jsonData.Bid)
	}
	if jsonData.CreatetimeS != "" {
		tx = tx.Where("m_fuwu_yu.createtime>?", define.TimeUnix(jsonData.CreatetimeS))
	}
	if jsonData.CreatetimeE != "" {
		tx = tx.Where("m_fuwu_yu.createtime<?", define.TimeUnix(jsonData.CreatetimeE))
	}
	if jsonData.ExpressNo != "" {
		tx = tx.Where("m_fuwu_yu.tel LIKE ?", "%"+jsonData.ExpressNo+"%")
	}
	tx = tx.Count(&count).Limit(jsonData.Limit).Offset(offsetVal).Order("id desc").Find(&list)
	if tx.Error != nil {
		c.JSON(http.StatusOK, gin.H{
			"code": 10001,
			"msg":  tx.Error,
		})
		return
	}
	c.JSON(http.StatusOK, gin.H{
		"success": true,
		"code":    0,
		"data": map[string]interface{}{
			"list":  list,
			"count": count,
		},
	})
}

type PaidanData struct {
	OperatorUid int `json:"operator_uid"`
	ID          int `gorm:"type:int(11); primaryKey" json:"id"`
	Bid         int `gorm:"type:int(11);" json:"bid"`    //服务商ID
	Status      int `gorm:"type:int(11);" json:"status"` //0未派单；1待接单;2服务中;3已完成；4取消，5异常
}

// 派单
func PaiDan(c *gin.Context) {
	var jsonData PaidanData
	err := c.ShouldBindJSON(&jsonData)
	if err != nil {
		define.Response.ResultFail(c, 10000, define.JsonData, "")
		return
	}
	//查询服务商
	var bData models.MBusiness
	err = models.DB.Model(new(models.MBusiness)).Where("id=?", jsonData.Bid).First(&bData).Error
	if err != nil {
		define.Response.ResultFail(c, 10001, err.Error(), "")
		return
	}
	//修改状态
	var editData = map[string]interface{}{
		"status":       jsonData.Status,
		"bid":          jsonData.Bid,
		"bid_name":     bData.Name,
		"operator_uid": jsonData.OperatorUid,
	}
	if jsonData.Status == 2 {
		editData["jie_time"] = int(time.Now().Unix())
	} else if jsonData.Status == 3 {
		editData["jie_time"] = int(time.Now().Unix())
		editData["endtime"] = int(time.Now().Unix())
	}
	err = models.DB.Model(new(models.MFuwuYu)).Where("id=?", jsonData.ID).Updates(&editData).Error
	if err != nil {
		define.Response.ResultFail(c, 10002, err.Error(), "")
		return
	}
	//写入日志
	userId, _ := strconv.Atoi(c.GetHeader("userId")) //将字符串转为int
	userName, bid := models.UserName(userId)
	logData := "管理员：" + userName + "，给预约服务id为:" + strconv.Itoa(jsonData.ID) + " 的服务派单"
	models.LogAdd(8, "派单", userId, logData, bid, 1)
	c.JSON(http.StatusOK, gin.H{
		"success": true,
		"code":    0,
		"msg":     "成功！",
	})
}

// 批量完成预约
type EngYeYueData struct {
	Ids []int `json:"ids"`
}

func EngYeYue(c *gin.Context) {
	var jsonData EngYeYueData
	err := c.ShouldBindJSON(&jsonData)
	if err != nil {
		define.Response.ResultFail(c, 10000, define.JsonData, "")
		return
	}
	//查询预约单
	var list []models.MFuwuYu
	curTime := int(time.Now().Unix()) + 10800
	err = models.DB.Model(new(models.MFuwuYu)).Where("id IN ? AND yu_yue_time<?", jsonData.Ids, curTime).Find(&list).Error
	if err != nil {
		define.Response.ResultFail(c, 10001, err.Error(), "")
		return
	}
	tx := models.DB.Begin()
	var payIds []int
	for _, v := range list {
		payIds = append(payIds, v.ID)
	}
	//使用IN批量修改数据来关闭订单
	var editData = map[string]interface{}{
		"status":  3,
		"endtime": int(time.Now().Unix()),
	}
	err = tx.Model(new(models.MFuwuYu)).Where("id IN ?", payIds).Updates(&editData).Error
	if err != nil {
		define.Response.ResultFail(c, 10002, err.Error(), "")
		tx.Rollback()
		return
	}
	//完成预约订单
	for _, v := range list {
		//调用修改服务套餐以及明细
		err = service.EditFuOrder(tx, v)
		if err != nil {
			define.Response.ResultFail(c, 10003, define.JsonDataX, "")
			tx.Rollback()
			return
		}
	}
	tx.Commit() //结束事务
	c.JSON(http.StatusOK, gin.H{
		"success": true,
		"code":    0,
		"data":    "成功",
	})
}
